"use strict";
const Parser = require('expr-eval').Parser;
/**
 * @name newStage
 * 新战斗系统
 */

/**
 * @name killMonster
 * @param json data 击杀数据
 * 击杀数量
 */
exports.killMonster = async function () {
    const data = this.get('data', 'json');
    for (let k in data) {
        this.updater.item.key(k);
    }
    this.updater.role.key('battlePoint');
    this.updater.role.key('fWbossID');
    this.updater.role.key('fWbossX');
    await this.updater.data();
    let battlePoint = this.updater.role.get('battlePoint') || 0;
    let num = 0;
    for (let k in data) {
        let unitData = this.updater.item.get(k);
        if (!unitData) {
            return this.quick_error('M2saghge190', '消耗的装备不存在', k);
        }
        if (typeof data[k] !== 'number') {
            return this.quick_error('M2saghge190', '参数错误', data[k]);
        }
        num += data[k];
        this.updater.item.set(k, "kill", unitData.kill + data[k]);
    }
    //击杀黑黑
    this.updater.record.add(12, num);
    this.updater.daily.add("record." + "12", num);
    //判断下黑流星
    let starID = this.updater.role.get('fWbossID') || 0;
    let fWbossX = this.updater.role.get("fWbossX") || 0;
    let fWboss = this.model.mongo('fWboss', this.sid);
    let fWbossData = await fWboss.mget(this.uid) || [];
    let fWbossXFlag = 0;
    if (starID != 0) {
        //判断是否有流星
        fWbossXFlag = 1;
    } else {
        //判断是否有正在打的boss
        for (let i in fWbossData) {
            if (fWbossData[i].uid == this.uid) {
                fWbossXFlag = 1;
                break;
            }
        }
    }
    if (!fWbossXFlag) {
        let starConfig = this.config("meteorGroup");
        if (!starConfig) {
            return this.quick_error("M7GHLB123", 'config_not_exist', "meteorGroup");
        }
        let meteorID = 0;
        for (let i in starConfig) {
            //判断是否解锁此流星，感觉是bug啊，这样1-1到1-3就不刷流星了诶
            if (starConfig[i].type == 2 && starConfig[i].effectStage <= battlePoint) {
                meteorID = starConfig[i].meteorID;
            }
        }
        if (meteorID != 0) {
            // //在此进行是否刷新出好友boss的判断
            // //根据fWbossX计算刷新概率，如果 (fwbossX-addRateNum) 大于0 ,rate = meteorRate+(fwbossX-addRateNum)*addRate
            // //否则 rate = meteorRate
            let rate = 0;
            let addRateNum = 0;
            let addRate = 0;
            let meteorConfig = this.config("friendBossMeteor", meteorID);
            if (!meteorConfig) {
                return this.quick_error("m2sgrbs1", "流星配置不存在", meteorID);
            }
            //计算本次刷新概率
            if (fWbossX > meteorConfig['addRateNum']) {
                addRateNum = fWbossX - meteorConfig['addRateNum'];
            }
            addRate = meteorConfig['addRate'] * addRateNum;
            rate = meteorConfig['meteorRate'] + addRate;
            //rate是万分比，计算本次是否会刷出boss
            let randomNum = Math.floor(Math.random() * 10000);
            if (randomNum < rate) {
                //刷新出boss
                fWbossXFlag = 1;
                fWbossX = 0;
                //TODO:pts关闭功能
                this.updater.role.set("fWbossID", meteorID);
            } else {
                fWbossX++
            }
            //TODO:pts关闭功能
            this.updater.role.set("fWbossX", fWbossX);
        }
    }
    return this.updater.save();
}

/**
 * @name startBattle
 * @param int id 关卡ID
 * @tip 主线通关记录在role.stage里
 * 创建战斗
 */
exports.startBattle = async function () {
    let id = this.get('id', 'int');
    if (!id) {
        return this.quick_error('N2BS1', "参数缺失");
    }
    // let hookStageFlag = false;
    let stageConfig = this.config("stage", id);
    if (!stageConfig) {
        // stageConfig = this.config("onHookBattle", id);
        // if (!stageConfig) {
        //     return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
        // }
        // hookStageFlag = true;
        return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
        // stageConfig['stageType'] = "normal";
    }
    let battleData = { "stageID": id, "id": this.uid }
    // //判断是主线还是挂机
    this.updater.role.key('stage.' + stageConfig['stageType']);
    // this.updater.role.key('lastHangStage');
    // this.updater.role.key('lastStage');
    await this.updater.data();
    // let lastHangStage = this.updater.role.get('lastHangStage') || 0;
    // let lastStage = this.updater.role.get('stage.' + stageConfig['stageType']);
    //判断前置条件
    // if (hookStageFlag) {
    //     if (stageConfig["stageIdbefore"]) {
    //         let beforeStageConfig = this.config("stage", stageConfig["stageIdbefore"]);
    //         if (!beforeStageConfig) {
    //             beforeStageConfig = this.config("onHookBattle", stageConfig["stageIdbefore"]);
    //             if (!beforeStageConfig) {
    //                 return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig["stageIdbefore"]);
    //             }
    //         }
    //         this.updater.role.key('stage.' + beforeStageConfig['stageType']);
    //         await this.updater.data();
    //         let lastStage = this.updater.role.get('stage.' + beforeStageConfig['stageType']);
    //         if (lastStage >= stageConfig["stageIdbefore"]) {
    //             if (lastHangStage != id) {
    //                 this.updater.role.set('lastHangStage', id);
    //                 await this.updater.save();
    //             }
    //         }
    //     } else {
    //         if (lastHangStage != id) {
    //             this.updater.role.set('lastHangStage', id);
    //             await this.updater.save();
    //         }
    //     }
    // }
    //判断前置条件
    if (stageConfig["beforeStage"]) {
        let beforeStageConfig = this.config("stage", stageConfig["beforeStage"]);
        if (!beforeStageConfig) {
            // beforeStageConfig = this.config("onHookBattle", stageConfig["beforeStage"]);
            // if (!beforeStageConfig) {
            return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig["beforeStage"]);
            // }
        }
        this.updater.role.key('stage.' + beforeStageConfig['stageType']);
        await this.updater.data();
        let lastStage = this.updater.role.get('stage.' + beforeStageConfig['stageType']);
        if (lastStage < stageConfig["beforeStage"]) {
            return this.quick_error("m2sgrbs1", "未满足关卡前置条件", id);
        }
    }
    // if (stageConfig['stageAllType'] == 1 && hookStageFlag) {
    //     this.updater.role.set('lastStage', id);
    //     await this.updater.save();
    // }
    let battleCache = this.model.redis("battleCache", this.sid);
    let battleTempData = await battleCache.get(this.uid);
    if (battleTempData != null) {
        await battleCache.del(battleTempData.stageID);
    }
    //创建战斗数据
    let ttl = 1 * 24 * 3600 //有效期1天
    await battleCache.set(battleData.id, battleData, ttl)
    return 0;
}



/**
 * @name endBattle
 * @param int id 关卡ID
 * 结束战斗
 */
exports.endBattle = async function () {
    let id = this.get('id', 'int');
    if (!id) {
        return this.quick_error('N2BS1', "参数缺失");
    }
    let battleCache = this.model.redis("battleCache", this.sid);
    let redisData = await battleCache.get(this.uid);
    if (redisData == null) {
        return { "win": false };
    }
    if (redisData.stageID != id) {
        return this.quick_error('N2BS1', "参数错误");
    }
    await battleCache.del(redisData.id);
    let stageConfig = this.config("stage", redisData.stageID);
    if (!stageConfig) {
        return this.quick_error("m2sgrbs1", "关卡配置不存在", redisData.stageID);
    }
    this.updater.role.key('stage.' + stageConfig['stageType']);
    //如果是资源关，要拿daily里的数据   resourseStar:今日次数
    this.updater.daily.key("record." + stageConfig['stageType'])
    await this.updater.data();
    let lastStage = this.updater.role.get('stage.' + stageConfig['stageType']);
    let tKey = [];
    //需要判断是主线通关，还是主线挂机还是资源关
    // switch (stageConfig['stageAllType']) {
    //     case 1:
    //         //普通类型关卡
    //         //写入数据
    //         // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
    //         //每日通关统计
    //         this.updater.record.add(19, 1);
    //         this.updater.daily.add("record." + stageConfig['stageType'], 1);
    //         break;
    //     case 2:
    //         //大世界关卡
    //         //写入数据
    //         // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
    //         //每日通关统计
    //         this.updater.daily.add("record." + stageConfig['stageType'], 1);
    //         break;
    //     case 3:
    //资源关关卡
    //stageRecovery
    // let resoureConfig = this.config("timeSharingStage", stageConfig['stageType']);
    // if (!resoureConfig) {
    //     return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig['stageType']);
    // }
    // let key = "record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId'];
    // this.updater.daily.key(key);
    await this.updater.data();
    this.updater.item.sub(stageConfig.ticket, 1);
    //次数判断
    // let stageNum = this.updater.daily.get(key) || 0;
    // if (stageNum >= resoureConfig["maxPassTime"]) {
    //     return this.quick_error("m2sgrbs1", "超过允许的最大次数", redisData.stageID);
    // }
    //每日通关统计
    this.updater.record.add(20, 1);
    this.updater.record.add(70, 1);
    tKey.push("record.20");
    tKey.push("record.70");
    var recordID_byAllResourseLevel = 20 + redisData.stageID.substr(redisData.stageID.length - 2, 2);
    var recordConfig_byAllResourseLevel = this.config("record", recordID_byAllResourseLevel);
    if (recordConfig_byAllResourseLevel) {
        this.updater.record.add(recordID_byAllResourseLevel, 1);
    }
    switch (stageConfig["stageType"]) {
        case "resourseExpStar":
            this.updater.record.add(24, 1);
            tKey.push("record.24");
            var stageID = stageConfig['stageID'].toString();
            var recordID = 24 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseUpgradeZero":
            this.updater.record.add(25, 1);
            this.updater.record.add(22, 1);
            tKey.push("record." + 25);
            tKey.push("record." + 22);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 25 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            recordID = 22 + stageID.substr(stageID.length - 2, 2);
            recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseUpgradeOri":
            this.updater.record.add(26, 1);
            this.updater.record.add(22, 1);
            tKey.push("record." + 26);
            tKey.push("record." + 22);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 26 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            recordID = 22 + stageID.substr(stageID.length - 2, 2);
            recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseUpgradeInf":
            this.updater.record.add(27, 1);
            this.updater.record.add(22, 1);
            tKey.push("record." + 27);
            tKey.push("record." + 22);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 27 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            recordID = 22 + stageID.substr(stageID.length - 2, 2);
            recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseSkillZero":
            this.updater.record.add(28, 1);
            this.updater.record.add(23, 1);
            tKey.push("record." + 28);
            tKey.push("record." + 23);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 28 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseSkillOri":
            this.updater.record.add(29, 1);
            this.updater.record.add(23, 1);
            tKey.push("record." + 29);
            tKey.push("record." + 23);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 29 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseSkillInf":
            this.updater.record.add(30, 1);
            this.updater.record.add(23, 1);
            tKey.push("record." + 30);
            tKey.push("record." + 23);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 30 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "chipInstance1":
        case "chipInstance2":
        case "chipInstance3":
        case "chipInstance4":
        case "chipInstance5":
            this.updater.record.add(21, 1);
            tKey.push("record." + 21);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 21 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
    }
    // this.updater.daily.add(key, 1);
    // break;
    //     default:
    //         return this.quick_error("m2sgrbs1", "关卡配置不存在", redisData.stageID);
    // }
    //给首通奖励
    if (lastStage < redisData.stageID) {
        //写入数据
        this.updater.role.set('stage.' + stageConfig['stageType'], redisData.stageID);
        this.updater.add(stageConfig["firstReward"], 1);
        for (let item of stageConfig["itemDrop"]) {
            this.updater.add(item.id, item.num);
        }
        this.updater.role.add('battlePoint', 1);
    }
    //给普通奖励
    if (stageConfig["reward"].length != 0) {
        for (let i = 0; i < stageConfig["reward"].length; i++) {
            if (stageConfig["reward"][i] != 0) {
                this.updater.add(stageConfig["reward"][i], 1);
            }
        }
    }
    var recordConfig = this.config("record", 18 + redisData.stageID);
    if (recordConfig) {
        this.updater.record.add(18 + redisData.stageID, 1);
    }
    await this.updater.save();
    for (let k in tKey) {
        this.updater.daily.add(tKey[k], 1);
    }
    await this.updater.save();
    return { "win": true }
}


/**
 * @name swapStage
 * @param int id 关卡ID
 * @param int num 扫荡次数
 * 扫荡关卡
 */
exports.swapStage = async function () {
    let id = this.get('id', 'int');
    let num = this.get('num', 'int');
    if (!id && !num) {
        return this.quick_error('N2BS1', "参数缺失");
    }
    let stageConfig = this.config("stage", id);
    if (!stageConfig) {
        return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
    }
    //debug  字段暂时没有
    // if(!stageConfig.swap) {
    //     return this.quick_error("m2sgrbs1", "关卡不允许扫荡", id);
    // }
    this.updater.role.key('stage.' + stageConfig['stageType']);
    //如果是资源关，要拿daily里的数据   resourseStar:今日次数
    this.updater.daily.key("record." + stageConfig['stageType'])
    await this.updater.data();
    let tKey = [];
    //需要判断是主线通关，还是主线挂机还是资源关
    // switch (stageConfig['stageAllType']) {
    //     case 1:
    //         //普通类型关卡
    //         //写入数据
    //         // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
    //         //每日通关统计
    //         this.updater.record.add(19, 1);
    //         this.updater.daily.add("record." + stageConfig['stageType'], num);
    //         break;
    //     case 2:
    //         //大世界关卡
    //         //写入数据
    //         // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
    //         //每日通关统计
    //         this.updater.daily.add("record." + stageConfig['stageType'], num);
    //         break;
    // case 3:
    //资源关关卡
    //stageRecovery
    // let resoureConfig = this.config("timeSharingStage", stageConfig['stageType']);
    // if (!resoureConfig) {
    //     return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig['stageType']);
    // }
    // let key = "record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId'];
    // this.updater.daily.key(key);
    // await this.updater.data();
    this.updater.record.add(20, 1);
    this.updater.record.add(70, 1);
    tKey.push("record.20");
    tKey.push("record.70");
    this.updater.item.sub(stageConfig.ticket, 1);
    //次数判断
    // let stageNum = this.updater.daily.get("record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId']) || 0;
    // if ((stageNum + num) > resoureConfig["maxPassTime"]) {
    //     return this.quick_error("m2sgrbs1", "超过允许的最大次数", id);
    // }
    //写入数据
    // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
    //每日通关统计
    switch (stageConfig["stageType"]) {
        case "resourseExpStar":
            this.updater.record.add(24, num);
            tKey.push("record.24");
            var stageID = stageConfig['stageID'].toString();
            var recordID = 24 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            break;
        case "resourseUpgradeZero":
            this.updater.record.add(25, num);
            this.updater.record.add(22, num);
            tKey.push("record." + 25);
            tKey.push("record." + 22);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 25 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            recordID = 22 + stageID.substr(stageID.length - 2, 2);
            recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            break;
        case "resourseUpgradeOri":
            this.updater.record.add(26, num);
            this.updater.record.add(22, num);
            tKey.push("record." + 26);
            tKey.push("record." + 22);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 26 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            recordID = 22 + stageID.substr(stageID.length - 2, 2);
            recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            break;
        case "resourseUpgradeInf":
            this.updater.record.add(27, num);
            this.updater.record.add(22, num);
            tKey.push("record." + 27);
            tKey.push("record." + 22);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 27 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            recordID = 22 + stageID.substr(stageID.length - 2, 2);
            recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            break;
        case "resourseSkillZero":
            this.updater.record.add(28, num);
            this.updater.record.add(23, num);
            tKey.push("record." + 28);
            tKey.push("record." + 23);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 28 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseSkillOri":
            this.updater.record.add(29, num);
            this.updater.record.add(23, num);
            tKey.push("record." + 29);
            tKey.push("record." + 23);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 29 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, 1);
            }
            break;
        case "resourseSkillInf":
            this.updater.record.add(30, num);
            this.updater.record.add(23, num);
            tKey.push("record." + 30);
            tKey.push("record." + 23);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 30 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            break;

        case "chipInstance1":
        case "chipInstance2":
        case "chipInstance3":
        case "chipInstance4":
        case "chipInstance5":
            this.updater.record.add(21, num);
            tKey.push("record." + 21);
            var stageID = stageConfig['stageID'].toString();
            var recordID = 21 + stageID.substr(stageID.length - 2, 2);
            var recordConfig = this.config("record", recordID);
            if (recordConfig) {
                this.updater.record.add(recordID, num);
            }
            break;
    }
    // this.updater.daily.add("record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId'], num);
    //     break;
    //         default:
    //     return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
    // }
    let ticketID = this.config("base", "moppingTicket").val;
    this.updater.sub(ticketID, num) //扣除扫荡券
    var recordConfig = this.config("record", 18 + id);
    if (recordConfig) {
        this.updater.record.add(18 + redisData.stageID, 1);
    }
    if (stageConfig["reward"].length != 0) {
        for (let i = 0; i < num; i++) {
            for (let i = 0; i < stageConfig["reward"].length; i++) {
                if (stageConfig["reward"][i] != 0) {
                    this.updater.add(stageConfig["reward"][i], 1);
                }
            }
        }
    }
    await this.updater.save();
    for (let k in tKey) {
        this.updater.daily.add(tKey[k], num);
    }
    return this.updater.save();
}




/**
 * @name startChallengeBattle
 * @param int id 关卡ID
 * @tip 主线通关记录在role.stage里
 * 创建战区战斗
 */
exports.startChallengeBattle = async function () {
    let id = this.get('id', 'int');
    if (!id) {
        return this.quick_error('N2BS1', "参数缺失");
    }
    let stageConfig = this.config("challenge");
    if (!stageConfig) {
        return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
    }
    let battleData = { "stageID": id, "id": this.uid }
    this.updater.role.key('battlePoint');
    await this.updater.data();
    let battlePoint = this.updater.role.get('battlePoint') || 0;
    //判断前置条件
    if ((battlePoint + 1) != id) {
        return this.quick_error("m2sgrbs1", "关卡错误", id);
    }
    let battleCache = this.model.redis("battleCache", this.sid);
    let battleTempData = await battleCache.get(this.uid);
    if (battleTempData != null) {
        await battleCache.del(battleTempData.stageID);
    }
    //创建战斗数据
    let ttl = 1 * 24 * 3600 //有效期1天
    await battleCache.set(battleData.id, battleData, ttl)
    return 0;
}



/**
 * @name endChallengeBattle
 * @param int id 关卡ID
 * 结束战区战斗
 */
exports.endChallengeBattle = async function () {
    let id = this.get('id', 'int');
    if (!id) {
        return this.quick_error('N2BS1', "参数缺失");
    }
    let battleCache = this.model.redis("battleCache", this.sid);
    let redisData = await battleCache.get(this.uid);
    if (redisData == null) {
        return { "win": false };
    }
    if (redisData.stageID != id) {
        return this.quick_error('N2BS1', "参数错误");
    }
    await battleCache.del(redisData.id);
    let stageConfig = this.config("challenge");
    if (!stageConfig) {
        return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
    }

    this.updater.role.key('battlePoint');
    await this.updater.data();
    let battlePoint = this.updater.role.get('battlePoint') || 0;
    if ((battlePoint + 1) != id) {
        return this.quick_error("m2sgrbs1", "关卡错误", id);
    }
    //给奖励
    this.updater.role.set('battlePoint', id);
    for (let i in stageConfig) {
        if (stageConfig[i].chapterStart <= id && stageConfig[i].chapterEnd > id) {
            let data;
            if (id % 10 == 0) {
                data = stageConfig[i].bossReward.split(',');
            } else {
                data = stageConfig[i].freeReward.split(',');
            }

            for (let i = 0; i < data.length; i++) {
                let itemData = data[i].split(":");
                let itemID = itemData[0];
                let formulaID = itemData[1];
                let formulaData = this.config("formula", formulaID);
                let formula = formulaData.expression;
                var parser = new Parser();
                let expression = parser.parse(formula);
                let result = expression.evaluate({ CHAPTER_LV: id });
                this.updater.item.add(parseInt(itemID), result);
            }
        }
    }
    this.updater.record.max(19, id);
    this.updater.record.add(70, 1);
    this.updater.daily.add("record.70", 1);
    await this.updater.save();
    return { "win": true }
}
